package estore.service;

import estore.model.Product;
import java.util.*;
import java.io.*;


/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {
    private String dataFilePath;
    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private final Map<String, Product> productData = new HashMap<>();

    public ProductService() {
        loadConfig(); // 先加载配置
        loadData();   // 再加载数据
        // 初始化默认商品（如果未从文件加载到，则使用默认值）
        if (productData.isEmpty()) {
            productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100));
            productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50));
            productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
            productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0));
        }
    }
    public void saveData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(dataFilePath))) {
            oos.writeObject(productData);
            System.out.println("商品数据已成功保存到 " + dataFilePath);
        } catch (IOException e) {
            System.err.println("保存数据失败：" + e.getMessage());
        }
    }

    public void loadData() {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(dataFilePath))) {
            @SuppressWarnings("unchecked")
            Map<String, Product> loadedData = (Map<String, Product>) ois.readObject();
            productData.clear();
            productData.putAll(loadedData);
            System.out.println("商品数据已成功从 " + dataFilePath + " 加载");
        } catch (FileNotFoundException e) {
            System.out.println("未找到数据文件，将使用初始数据。");
        } catch (IOException | ClassNotFoundException e) {
            System.err.println("加载数据失败：" + e.getMessage());
        }
    }
    /**
     * 获取所有商品列表
     *
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }

    /**
     * 根据ID查找商品
     *
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }

    private void loadConfig() {
        Properties props = new Properties();
        try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("config.properties")) {
            if (inputStream == null) {
                System.err.println("配置文件 config.properties 未在 classpath 中找到！使用默认路径。");
                dataFilePath = "products.dat"; // 默认路径
                return;
            }
            props.load(inputStream);
            dataFilePath = props.getProperty("data.file.path");
            if (dataFilePath == null) {
                throw new IllegalArgumentException("配置文件中未找到 data.file.path");
            }
        } catch (IOException e) {
            System.err.println("加载配置文件失败：" + e.getMessage());
            dataFilePath = "products.dat"; // 使用默认路径
        }
    }

}